package cn.iocoder.yudao.module.design.service.problemdealerrel;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.design.controller.admin.problemdealerrel.vo.ProblemDealerRelCreateReqVO;
import cn.iocoder.yudao.module.design.controller.admin.problemdealerrel.vo.ProblemDealerRelExportReqVO;
import cn.iocoder.yudao.module.design.controller.admin.problemdealerrel.vo.ProblemDealerRelPageReqVO;
import cn.iocoder.yudao.module.design.controller.admin.problemdealerrel.vo.ProblemDealerRelUpdateReqVO;
import cn.iocoder.yudao.module.design.dal.dataobject.problemdealerrel.ProblemDealerRelDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 问题处理人关联 Service 接口
 *
 * @author 芋道源码
 */
public interface ProblemDealerRelService {

    /**
     * 创建问题处理人关联
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createProblemDealerRel(@Valid ProblemDealerRelCreateReqVO createReqVO);
    /**
     * 创建问题处理人关联
     *
     * @param userId 处理人
     * @param problemId 问题id
     * @return 编号
     */
    Long createProblemDealerRel(Long userId, Long problemId);

    /**
     * 更新问题处理人关联
     *
     * @param updateReqVO 更新信息
     */
    void updateProblemDealerRel(@Valid ProblemDealerRelUpdateReqVO updateReqVO);

    /**
     * 删除问题处理人关联
     *
     * @param id 编号
     */
    void deleteProblemDealerRel(Long id);

    /**
     * 删除问题处理人关联
     *
     * @param userId 编号
     */
    void deleteProblemDealerRel(Long userId,Long problemId);

    /**
     * 获得问题处理人关联
     *
     * @param id 编号
     * @return 问题处理人关联
     */
    ProblemDealerRelDO getProblemDealerRel(Long id);

    /**
     * 获得问题处理人关联列表
     *
     * @param ids 编号
     * @return 问题处理人关联列表
     */
    List<ProblemDealerRelDO> getProblemDealerRelList(Collection<Long> ids);

    /**
     * 获得问题处理人关联分页
     *
     * @param pageReqVO 分页查询
     * @return 问题处理人关联分页
     */
    PageResult<ProblemDealerRelDO> getProblemDealerRelPage(ProblemDealerRelPageReqVO pageReqVO);

    /**
     * 获得问题处理人关联列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 问题处理人关联列表
     */
    List<ProblemDealerRelDO> getProblemDealerRelList(ProblemDealerRelExportReqVO exportReqVO);


    List<ProblemDealerRelDO> getProblemDealerRelListByProblemId(Long problemId);

    /**
     * 获得问题处理人关联列表
     *
     * @param userId 编号
     * @return 问题处理人关联列表
     */
    List<ProblemDealerRelDO> getProblemDealerRelListByUserId(Long userId);
    /**
     * 获得问题处理人关联列表
     *
     * @param problemIds 编号
     * @return 问题处理人关联列表
     */
    List<ProblemDealerRelDO> getProblemDealerRelListByProblemIds(Collection<Long> problemIds);

    default Map<Long, List<ProblemDealerRelDO>> getProblemDealerRelListMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMultiMap(getProblemDealerRelListByProblemIds(ids), ProblemDealerRelDO::getProblemId);
    }

    void updateProblemDealerRelStatus(Long problemId, Long userId, String statusCd);
}
